package com.zty.websocket.config;

import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;
import java.util.List;
import java.util.Map;

/**
 * @Author ZTY
 * @Description 这里做各种鉴权
 * @Date 14:00 2023-12-15
 **/

@Component
public class WebSocketServerConfig extends ServerEndpointConfig.Configurator {


    /**
     * 获取当前线程的HttpServletRequest对象，以便在代码中使用HttpServletRequest对象中的方法和属性。
     * 在Java Web应用程序中，HttpServletRequest对象是一个非常重要的对象，
     * 它封装了HTTP请求的相关信息，包括请求的URL、请求参数、请求头、请求体等。
     *
     * @param originHeaderValue
     * @return
     */
    @Override
    public boolean checkOrigin(String originHeaderValue) {
        //  拿到外部的Attribute  通过RequestContextHolder获取当前线程的ServletRequestAttributes对象
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

        //  拿到request，就可以去做各种操作(取连接操作，校验)   从ServletRequestAttributes对象中获取HttpServletRequest对象
        HttpServletRequest request = servletRequestAttributes.getRequest();

        //  写校验逻辑，此处省略一万行代码（后期另开一个仓库补充ZTY-AUTH）
        return true;
    }

    /**
     * 有一些websocket是需要传一些参数的，包括登录人，登录方式等。这些可以通过request进行解析
     * 这段代码的应用场景是在WebSocket握手时获取并设置一些自定义参数，
     * 比如用户ID、认证信息等。这些参数可以在WebSocket连接建立后被应用程序使用，
     * 以便实现一些自定义的业务逻辑。
     * @param sec
     * @param request
     * @param response
     */
    @Override
    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
        //  先获取websocket所有的请求参数
        Map<String, List<String>> parameterMap = request.getParameterMap();

        //  拿到想要的erp参数值（无意义）
        List<String> erpList = parameterMap.getOrDefault("erp", null);

        if (!CollectionUtils.isEmpty(erpList)) {
            sec.getUserProperties().put("erp", erpList.get(0));
        }
    }

}
